/**
 * 这里存放的是加密解密的各种算法
 */
import crypto, { publicEncrypt } from "crypto";
import { AES } from "crypto-js";
import { isUndefined } from "lodash";
import CryptoJS from "crypto-js";
import { getAesKey } from "@/utils/aeskey";

/**
 * 存储在程序中的公钥
 */
let _publicKey: string;
export enum codingType {
  typeStr = "base64"
}
/**
 * 获取公钥
 * 注意，这里不要使用readFileSync。因为浏览器中是没有读取文件的系统的。
 * nodejs在这里会置空这个函数。
 */
export const getPublicKey = () =>
  (_publicKey = isUndefined(_publicKey)
    ? process.env.VUE_APP_AESKEY_PUBLIC + ""
    : _publicKey);
/**
 * 获取用公钥加密的aes密钥
 */
export const getEncodedAesKey = (): string => {
  const pKey = getPublicKey();
  const aKey = getAesKey();
  const tempPKey = publicEncrypt(
    { key: pKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING },
    Buffer.from(aKey)
  );
  const base64Key = tempPKey.toString(codingType.typeStr);
  return base64Key;
};
/**
 * 使用aeskey加密数据。
 * 注意这里的data，必须是json格式的。
 * 否则，比如data:"test"，decode出来的时候，结果就是 ""test""，这样的用户名是不正确的。
 */
export const encodeDataByAesKey = (data: any): string =>
  AES.encrypt(JSON.stringify(data), getAesKey()).toString();
/**
 * 使用aeskey解密数据。
 * @param data 这里的数据必须是string类型
 */
export const decodeDataByAesKey = (data: string): any =>
  AES.decrypt(data, getAesKey()).toString(CryptoJS.enc.Utf8);
